package com.ruoyi.web.controller.utils;


import org.csource.common.MyException;
import org.csource.fastdfs.*;

import java.io.IOException;

/**
 * 上传到fastDFS
 * @author : 张培浩
 * @date : 2023/3/14 22:37
 **/
public class fastDFSUtils {

    /**
     * 文件上传
     */
    public static  String[] upload(byte[] buffFile,String fileExtName) {
        TrackerServer trackerServer = null;
        StorageServer storageServer = null;
        try {
            // 读取fastDFS的配置文件,将tracker的地址读取到内存中
            ClientGlobal.init("fastdfs.conf");
            TrackerClient trackerClient = new TrackerClient();
             trackerServer =trackerClient.getConnection();
             storageServer = trackerClient.getStoreStorage(trackerServer);
            // 定义storage的客户端对象,需要使用这个对象完成具体的文件上传 下载和删除
            StorageClient storageClient = new StorageClient(trackerServer,storageServer);
            /**
             * 文件上传
             * 参数1 需要上传文件的字节数组
             * 参数2 需要上传文件的扩展名
             * 参数3 文件的属性通常不上传
             * 返回一个String数组 这个数据对于我们很重要 建议方法数据库
             */
            String[] result = storageClient.upload_file(buffFile,fileExtName,null);
            // 打印返回数据信息
           return result;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        } finally {
            if (trackerServer != null){
                try {
                    trackerServer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (storageServer != null){
                try {
                    storageServer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    /**
     * 文件下载
     */
    public static byte[] download(String groupName,String remoteFileName) {
        TrackerServer trackerServer = null;
        StorageServer storageServer = null;
        try {
            // 读取fastDFS的配置文件,将tracker的地址读取到内存中
            ClientGlobal.init("fastdfs.conf");
            TrackerClient trackerClient = new TrackerClient();
            trackerServer =trackerClient.getConnection();
            storageServer = trackerClient.getStoreStorage(trackerServer);
            // 定义storage的客户端对象,需要使用这个对象完成具体的文件上传 下载和删除
            StorageClient storageClient = new StorageClient(trackerServer,storageServer);
            /**
             * 文件下载
             * 参数1 需要下载文件的组名
             * 参数2 需要下载文件的远程文件名
             * 参数3 需要下载文件保存到的本地地址
             * result 返回值为0时代表删除成功 其他值都代表删除失败
             */
            byte[] result =  storageClient.download_file(groupName,remoteFileName);
            return result;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        } finally {
            if (trackerServer != null){
                try {
                    trackerServer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (storageServer != null){
                try {
                    storageServer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    /**
     * 文件删除
     */
    public static void delete(String groupName,String remoteFileName) {
        TrackerServer trackerServer = null;
        StorageServer storageServer = null;
        try {
            // 读取fastDFS的配置文件,将tracker的地址读取到内存中
            ClientGlobal.init("fastdfs.conf");
            TrackerClient trackerClient = new TrackerClient();
            trackerServer =trackerClient.getConnection();
            storageServer = trackerClient.getStoreStorage(trackerServer);
            // 定义storage的客户端对象,需要使用这个对象完成具体的文件上传 下载和删除
            StorageClient storageClient = new StorageClient(trackerServer,storageServer);
            /**
             * 文件删除
             * 参数1 需要下载文件的组名
             * 参数2 需要下载文件的远程文件名
             * result 返回值为0时代表删除成功 其他值都代表删除失败
             */
            int result =  storageClient.delete_file(groupName,remoteFileName);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        } finally {
            if (trackerServer != null){
                try {
                    trackerServer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (storageServer != null){
                try {
                    storageServer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
